package com.w7vm.menuweb.managerBean;


import java.io.Serializable;
import java.text.ParseException;
import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.RequestScoped;

import javax.ejb.EJB;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.persistence.PersistenceException;

import com.w7vm.menuweb.entity.AcessoWeb;
import com.w7vm.menuweb.entity.RestauranteFilialWeb;
import com.w7vm.menuweb.entity.RestauranteSedeWeb;
import com.w7vm.menuweb.entity.UsuarioWeb;
import com.w7vm.menuweb.facade.UserFacade;
import com.w7vm.menuweb.message.MessageFaces;
import com.w7vm.menuweb.utility.Constantes;
import com.w7vm.menuweb.utility.DataUtils;
import com.w7vm.menuweb.utility.PropertiesLoaderImpl;

@ManagedBean
@RequestScoped
public class UsuarioMB implements Serializable{


	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	@EJB
	private UserFacade userFacade;
	
	private UsuarioWeb usuario = new UsuarioWeb();
	private AcessoWeb acesso = new AcessoWeb();
	private MessageFaces msgObj = new MessageFaces();
	private String perfilSessao;
	private LoginMB loginOjb = new LoginMB();
	Constantes constObj = new Constantes();

	
	private String descPerfil;
	
	public String getDescPerfil() {
		return descPerfil;
	}

	public void setDescPerfil(String descPerfil) {
		this.descPerfil = descPerfil;
	}

	@ManagedProperty(value = "#{restauranteFilialMB}")
	private RestauranteFilialMB restauranteFilialMB;

	@ManagedProperty(value = "#{restauranteMB}")
	public RestauranteMB restauranteMB;
	
	@ManagedProperty(value = "#{acessoMB}")
	public AcessoMB acessoMB;
	
	public RestauranteMB getRestauranteMB() {
		return restauranteMB;
	}

	public void setRestauranteMB(RestauranteMB restauranteMB) {
		this.restauranteMB = restauranteMB;
	}

	public UsuarioWeb getUsuario() {
		
		if(usuario == null){
			return usuario;
		}
		return usuario;
	}
	
	public void setUsuario(UsuarioWeb usuario) {
		this.usuario = usuario;
	}

	public AcessoWeb getAcesso() {
		return acesso;
	}

	public void setAcesso(AcessoWeb acesso) {
		this.acesso = acesso;
	}
	
	//---------------------- S A L V A R ----------------------------------------------------------
	
	public void salvarUsuario() throws ParseException{
		System.out.println("SAlvarUsuario()");
		String profileUser = (String) loginOjb.getSessao("Perfil");

		if(profileUser.equals(constObj.PERFIL_ADMIN_CONTA)){
			salvarUsuarioPerfilAdmConta();
		}else if(profileUser.equals(constObj.PERFIL_ADMIN_RESTAURANTE)){
			salvarUsuarioPerfilAdmRestaurante();
		}
	}
		
		
	public void salvarUsuarioPerfilAdmConta() throws ParseException{
		System.out.println("salvarUsuarioPerfilAdmConta()");
		List<RestauranteFilialWeb> filiais = null;
		List<AcessoWeb> restaurante = null;
		filiais = restauranteFilialMB.getFiliaisSource(); 
		Constantes constObj = new Constantes();
		DataUtils dateUtils = new DataUtils();

		try{
			Thread.sleep(1200);
		
			if(filiais.size() > 0)  // Verifica se tem filial 
			{
				filiais = restauranteFilialMB.getFiliaisTarget();
				restaurante = acessoMB.getRestauranteTarget(); 
				
				System.out.println("RestauranteTarget() --------------------  "+ restaurante.size());
				System.out.println("FilialTarget() -------------------------  "+ filiais.size());
	
	
				if(filiais.size() <= 0 && restaurante.size() <= 0) // verifica se foi selecionado tela na alguma filial acesso
				{
						String msgTitulo = PropertiesLoaderImpl.getValor("tErroValidacaoAcesso");
						msgObj.sendErrorMessageToUser(msgTitulo,"");
				}
				else{
					// Relação oneToMany Usuario - Acesso / Persiste o objeto Usuario
						
					usuario.setStatus(constObj.ATIVO);
					usuario.setDataInc(dateUtils.getPegaDataAtual());
							
					try{
						usuario = userFacade.saveUsuario(usuario);
					} catch (PersistenceException e) {
						e.printStackTrace();
						String msgTitulo = PropertiesLoaderImpl.getValor("tErroCadUsuario");
						msgObj.sendErrorMessageToUser(msgTitulo, "");
					}
					
					// IF para verificar se o restaurante foi selecionado na tela para acesso
					if(restaurante.size() > 0){
						RestauranteSedeWeb RestauranteSedeWeb = new RestauranteSedeWeb();
						int idRestaurante = (Integer) loginOjb.getSessao("IDRestaurante");
						System.out.println("Persiste Entidade Restaurante:ID "+ idRestaurante);
	
						RestauranteSedeWeb.setIdRestauranteSedeWeb(idRestaurante);
						acesso.setRestauranteSedeWeb(RestauranteSedeWeb);
						acesso.setUsuarioWeb(usuario);
						acesso.setPerfil(descPerfil);
						acesso.setAcessoFilial(constObj.ACESSO_FILIAL_NAO);
						
						try{ // Persiste entidade Acesso
							userFacade.saveAcesso(acesso);
							String msgTitulo = PropertiesLoaderImpl.getValor("tSuccessCadUsuario");
							if(filiais.size() <= 0){ // Se filial não tiver sido selecionada returna mensagem sucesso tela
								msgObj.sendInfoMessageToUser(msgTitulo, "");
								usuario = new UsuarioWeb();
								acesso = new AcessoWeb();
							}
						} catch (PersistenceException e) {
							e.printStackTrace();
							userFacade.delete(usuario);
							String msgTitulo = PropertiesLoaderImpl.getValor("tErroCadUsuario");
							msgObj.sendErrorMessageToUser(msgTitulo, "");
						}
					}
	
					if(filiais.size() > 0){ // Caso filial foi selecionada na tela persiste entidade Filial
	
						for(RestauranteFilialWeb rest : filiais){  // Qtde de filial selecionada
							// Relação oneToMany Usuario - Acesso / Persiste o objeto Acesso por filial
							RestauranteFilialWeb objFilial = new RestauranteFilialWeb();
							RestauranteSedeWeb objRestaurante = new RestauranteSedeWeb();
							objFilial.setIdRestauranteFilialWeb(rest.getIdRestauranteFilialWeb());
							objRestaurante.setIdRestauranteSedeWeb(rest.getRestauranteSedeWeb().getIdRestauranteSedeWeb());
	
							System.out.println("Persiste Entidade Filial:ID "+ rest.getIdRestauranteFilialWeb());
	
							acesso.setRestauranteSedeWeb(objRestaurante);
							acesso.setRestauranteFilialWeb(objFilial);
							acesso.setPerfil(descPerfil);
							acesso.setAcessoFilial(constObj.ACESSO_FILIAL_SIM);
							acesso.setUsuarioWeb(usuario);
									
							try{
								userFacade.saveAcesso(acesso);
							} catch (PersistenceException e) {
								e.printStackTrace();
								userFacade.delete(usuario);
								String msgTitulo = PropertiesLoaderImpl.getValor("tErroCadUsuario");
								msgObj.sendErrorMessageToUser(msgTitulo, "");
								}
						}
						String msgTitulo = PropertiesLoaderImpl.getValor("tSuccessCadUsuario");
						msgObj.sendInfoMessageToUser(msgTitulo, "");
						usuario = new UsuarioWeb();
						acesso = new AcessoWeb();
					}
				}
			} 
			else{ // Restaurante não tem filial
				
				RestauranteSedeWeb RestauranteSedeWeb = new RestauranteSedeWeb();
				int idRestaurante = (Integer) loginOjb.getSessao("IDRestaurante");
				RestauranteSedeWeb.setIdRestauranteSedeWeb(idRestaurante);
						
				usuario.setStatus(constObj.ATIVO);
				usuario.setDataInc(dateUtils.getPegaDataAtual());
						
				try{ // Persiste entidade Usuario
					usuario = userFacade.saveUsuario(usuario);
				} catch (PersistenceException e) {
					e.printStackTrace();
					String msgTitulo = PropertiesLoaderImpl.getValor("tErroCadUsuario");
					String msgCorpo = PropertiesLoaderImpl.getValor("ctErroCadUsuario");
					msgObj.sendErrorMessageToUser(msgTitulo, msgCorpo);
				}
						
				acesso.setUsuarioWeb(usuario);
				acesso.setRestauranteSedeWeb(RestauranteSedeWeb);
				acesso.setPerfil(descPerfil);
				acesso.setAcessoFilial(constObj.ACESSO_FILIAL_NAO);
				
				try{ // Persiste entidade Acesso
					userFacade.saveAcesso(acesso);
					String msgTitulo = PropertiesLoaderImpl.getValor("tSuccessCadUsuario");
					msgObj.sendInfoMessageToUser(msgTitulo, "");
					usuario = new UsuarioWeb();
					acesso = new AcessoWeb();
				} catch (PersistenceException e) {
					e.printStackTrace();
					userFacade.delete(usuario);
					String msgTitulo = PropertiesLoaderImpl.getValor("tErroCadUsuario");
					msgObj.sendErrorMessageToUser(msgTitulo, "");
				}
			}
		} catch (InterruptedException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
	}
	
	public void salvarUsuarioPerfilAdmRestaurante() throws ParseException{
		System.out.println("salvarUsuarioPerfilAdmRestaurante()");
		
		Constantes constObj = new Constantes();
		DataUtils dateUtils = new DataUtils();
		
		System.out.println("========================================================================");
		
		System.out.println("RestauranteTarget()   "+ acessoMB.getRestauranteTarget().size());
		System.out.println("FilialTarget()   "+ acessoMB.getFiliaisAdmRestTarget().size());
		
		if((acessoMB.getRestauranteTarget().size() > 0) | 
			(acessoMB.getFiliaisAdmRestTarget().size() > 0)){
			
			// Persiste entidade Usuario, caso restaurante e/ou filiais estiverem selecionado
			usuario.setStatus(constObj.ATIVO);
			usuario.setDataInc(dateUtils.getPegaDataAtual());
					
			try{
				usuario = userFacade.saveUsuario(usuario);
			} catch (PersistenceException e) {
				e.printStackTrace();
				String msgTitulo = PropertiesLoaderImpl.getValor("tErroCadUsuario");
				msgObj.sendErrorMessageToUser(msgTitulo, "");
			}
			
			// Persiste entidade Acesso - Restaurante, caso algum restaurante estiver sido selecionado
			if(acessoMB.getRestauranteTarget().size() > 0){
				RestauranteSedeWeb RestauranteSedeWeb = new RestauranteSedeWeb();
				int idRestaurante = (Integer) loginOjb.getSessao("IDRestaurante");
				System.out.println("Persiste Entidade Restaurante:ID "+ idRestaurante);

				System.out.println("USUARIO_ID "+ usuario.getIdUsuarioWeb());

				RestauranteSedeWeb.setIdRestauranteSedeWeb(idRestaurante);
				acesso.setRestauranteSedeWeb(RestauranteSedeWeb);
				acesso.setUsuarioWeb(usuario);
				acesso.setPerfil(descPerfil);
				acesso.setAcessoFilial(constObj.ACESSO_FILIAL_NAO);
				
				try{ // Persiste entidade Acesso
					userFacade.saveAcesso(acesso);
					if(acessoMB.getFiliaisAdmRestTarget().size() == 0 ){ 
						// Se filial não tiver sido selecionada returna mensagem sucesso tela
						String msgTitulo = PropertiesLoaderImpl.getValor("tSuccessCadUsuario");
						msgObj.sendInfoMessageToUser(msgTitulo, "");
						usuario = new UsuarioWeb();
						acesso = new AcessoWeb();
					}
				} catch (PersistenceException e) {
					e.printStackTrace();
					userFacade.delete(usuario);
					String msgTitulo = PropertiesLoaderImpl.getValor("tErroCadUsuario");
					msgObj.sendErrorMessageToUser(msgTitulo, "");
				}
			}
			// Persiste entidade Acesso - Filiais, caso alguma filial estiver sido selecionado
			if(acessoMB.getFiliaisAdmRestTarget().size() > 0){ 
				List<AcessoWeb> filiaisAdmRest = null;
				filiaisAdmRest = acessoMB.getFiliaisAdmRestTarget(); 

				for(AcessoWeb rest : filiaisAdmRest){  // Qtde de filial selecionada
					// Relação oneToMany Usuario - Acesso / Persiste o objeto Acesso por filial
					RestauranteFilialWeb objFilial = new RestauranteFilialWeb();
					RestauranteSedeWeb objRestaurante = new RestauranteSedeWeb();
					objFilial.setIdRestauranteFilialWeb(rest.getRestauranteFilialWeb().getIdRestauranteFilialWeb());
					objRestaurante.setIdRestauranteSedeWeb(rest.getRestauranteSedeWeb().getIdRestauranteSedeWeb());

					System.out.println("Persiste Entidade Filial:ID "+ rest.getRestauranteFilialWeb().getIdRestauranteFilialWeb());

					acesso.setRestauranteSedeWeb(objRestaurante);
					acesso.setRestauranteFilialWeb(objFilial);
					acesso.setPerfil(descPerfil);
					acesso.setAcessoFilial(constObj.ACESSO_FILIAL_SIM);
					acesso.setUsuarioWeb(usuario);
							
					try{
						userFacade.saveAcesso(acesso);
					} catch (PersistenceException e) {
						e.printStackTrace();
						userFacade.delete(usuario);
						String msgTitulo = PropertiesLoaderImpl.getValor("tErroCadUsuario");
						msgObj.sendErrorMessageToUser(msgTitulo, "");
						}
				}
				String msgTitulo = PropertiesLoaderImpl.getValor("tSuccessCadUsuario");
				msgObj.sendInfoMessageToUser(msgTitulo, "");
				usuario = new UsuarioWeb();
				acesso = new AcessoWeb();
			}
		}
		else {
			String msgTitulo = PropertiesLoaderImpl.getValor("tErroValidacaoAcesso");
			msgObj.sendErrorMessageToUser(msgTitulo,"");
		}

	}
	
	
//---------------------- ALTERAR DADOS USUARIO ----------------------------------------------------------
// Funcionalidade: MinhaConta
	
	public void alterarDadosUsuario(ActionEvent event){
		
		System.out.println("alterarDadosUsuario()");
		System.out.println("alterarDadosUsuario() "+ usuario.getNome());

	}

//--------------------------------------------------------------------------------------------------

	
	private FacesContext getContext() {
		FacesContext context = FacesContext.getCurrentInstance();
		return context;
	}

	public RestauranteFilialMB getRestauranteFilialMB() {
		return restauranteFilialMB;
	}

	public void setRestauranteFilialMB(RestauranteFilialMB restauranteFilialMB) {
		this.restauranteFilialMB = restauranteFilialMB;
	}

	public String getPerfilSessao() {
		return perfilSessao = (String) loginOjb.getSessao("Perfil");
		
	}

	public AcessoMB getAcessoMB() {
		return acessoMB;
	}

	public void setAcessoMB(AcessoMB acessoMB) {
		this.acessoMB = acessoMB;
	}
	
	
}
